home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / gcc-lib / i686-pc-linux-gnu / 3.3.6 / install-tools / fixinc.sh next >
Linux/UNIX/POSIX Shell Script  |  2005-10-13  |  13KB  |  480 lines

  1. #!/bin/sh
  2. #
  3. #  EDIT THIS FILE - it is no longer generated
  4. #
  5. # Install modified versions of certain ANSI-incompatible system header
  6. # files which are fixed to work correctly with ANSI C and placed in a
  7. # directory that GNU C will search.
  8. #
  9. # See README-fixinc for more information.
  10. #
  11. #  fixincludes copyright (c) 1998, 1999, 2000, 2002
  12. #  The Free Software Foundation, Inc.
  13. #
  14. # fixincludes is free software.
  15. # You may redistribute it and/or modify it under the terms of the
  16. # GNU General Public License, as published by the Free Software
  17. # Foundation; either version 2, or (at your option) any later version.
  18. # fixincludes is distributed in the hope that it will be useful,
  19. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  21. # See the GNU General Public License for more details.
  22. # You should have received a copy of the GNU General Public License
  23. # along with fixincludes.  See the file "COPYING".  If not,
  24. # write to:  The Free Software Foundation, Inc.,
  25. #            59 Temple Place - Suite 330,
  26. #            Boston,  MA  02111-1307, USA.
  27. #
  28. # # # # # # # # # # # # # # # # # # # # #
  29. #
  30. # Directory in which to store the results.
  31. # Fail if no arg to specify a directory for the output.
  32. if [ "x$1" = "x" ]
  33. then
  34.   echo fixincludes: no output directory specified
  35.   exit 1
  36. fi
  37.  
  38. LIB=${1}
  39. shift
  40.  
  41. # Make sure it exists.
  42. if [ ! -d $LIB ]; then
  43.   mkdir $LIB || {
  44.     echo fixincludes:  output dir '`'$LIB"' cannot be created"
  45.     exit 1
  46.   }
  47. else
  48.   ( cd $LIB && touch DONE && rm DONE ) || {
  49.     echo fixincludes:  output dir '`'$LIB"' is an invalid directory"
  50.     exit 1
  51.   }
  52. fi
  53.  
  54. if test -z "$VERBOSE"
  55. then
  56.   VERBOSE=2
  57.   export VERBOSE
  58. else
  59.   case "$VERBOSE" in
  60.   [0-9] ) : ;;
  61.   * )  VERBOSE=3 ;;
  62.   esac
  63. fi
  64.  
  65. # Define what target system we're fixing.
  66. #
  67. if test -r ./Makefile; then
  68.   target_canonical="`sed -n -e 's,^target[     ]*=[     ]*\(.*\)$,\1,p' < Makefile`"
  69. fi
  70.  
  71. # If not from the Makefile, then try config.guess
  72. #
  73. if test -z "${target_canonical}" ; then
  74.   if test -x ./config.guess ; then
  75.     target_canonical="`config.guess`" ; fi
  76.   test -z "${target_canonical}" && target_canonical=unknown
  77. fi
  78. export target_canonical
  79.  
  80. # # # # # # # # # # # # # # # # # # # # #
  81. #
  82. # Define PWDCMD as a command to use to get the working dir
  83. # in the form that we want.
  84. PWDCMD=${PWDCMD-pwd}
  85.  
  86. case "`$PWDCMD`" in
  87. //*)
  88.     # On an Apollo, discard everything before `/usr'.
  89.     PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'"
  90.     ;;
  91. esac
  92.  
  93. # Original directory.
  94. ORIGDIR=`${PWDCMD}`
  95. export ORIGDIR
  96. FIXINCL=${ORIGDIR}/fixinc/fixincl
  97. if [ ! -x $FIXINCL ] ; then
  98.   FIXINCL=${ORIGDIR}/fixincl
  99.   if [ ! -x $FIXINCL ] ; then
  100.     echo "Cannot find working fixincl" >&2
  101.     exit 1
  102.   fi
  103. fi
  104. export FIXINCL
  105.  
  106. # Make LIB absolute only if needed to avoid problems with the amd.
  107. case $LIB in
  108. /*)
  109.     ;;
  110. *)
  111.     cd $LIB; LIB=`${PWDCMD}`
  112.     ;;
  113. esac
  114.  
  115. if test $VERBOSE -gt 0
  116. then echo Fixing headers into ${LIB} for ${target_canonical} target ; fi
  117.  
  118. # Determine whether this system has symbolic links.
  119. if test -n "$DJDIR"; then
  120.   LINKS=false
  121. elif ln -s X $LIB/ShouldNotExist 2>/dev/null; then
  122.   rm -f $LIB/ShouldNotExist
  123.   LINKS=true
  124. elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then
  125.   rm -f /tmp/ShouldNotExist
  126.   LINKS=true
  127. else
  128.   LINKS=false
  129. fi
  130.  
  131. # # # # # # # # # # # # # # # # # # # # #
  132. #
  133. #  Search each input directory for broken header files.
  134. #  This loop ends near the end of the file.
  135. #
  136. if test $# -eq 0
  137. then
  138.     INPUTLIST="/usr/include"
  139. else
  140.     INPUTLIST="$@"
  141. fi
  142.  
  143. for INPUT in ${INPUTLIST} ; do
  144.  
  145. cd ${ORIGDIR}
  146.  
  147. #  Make sure a directory exists before changing into it,
  148. #  otherwise Solaris2 will fail-exit the script.
  149. #
  150. if [ ! -d ${INPUT} ]; then
  151.   continue
  152. fi
  153. cd ${INPUT}
  154.  
  155. INPUT=`${PWDCMD}`
  156. export INPUT
  157.  
  158. #
  159. # # # # # # # # # # # # # # # # # # # # #
  160. #
  161. if test $VERBOSE -gt 1
  162. then echo Finding directories and links to directories ; fi
  163.  
  164. # Find all directories and all symlinks that point to directories.
  165. # Put the list in $all_dirs.
  166. # Each time we find a symlink, add it to newdirs
  167. # so that we do another find within the dir the link points to.
  168. # Note that $all_dirs may have duplicates in it;
  169. # later parts of this file are supposed to ignore them.
  170. dirs="."
  171. levels=2
  172. all_dirs=""
  173. search_dirs=""
  174.  
  175. while [ -n "$dirs" ] && [ $levels -gt 0 ]
  176. do
  177.   levels=`expr $levels - 1`
  178.   newdirs=
  179.   for d in $dirs
  180.   do
  181.     if test $VERBOSE -gt 1
  182.     then echo " Searching $INPUT/$d" ; fi
  183.  
  184.     # Find all directories under $d, relative to $d, excluding $d itself.
  185.     # (The /. is needed after $d in case $d is a symlink.)
  186.     all_dirs="$all_dirs `find $d/. -type d -print | \
  187.                sed -e '/\/\.$/d' -e 's@/./@/@g'`"
  188.     # Find all links to directories.
  189.     # Using `-exec test -d' in find fails on some systems,
  190.     # and trying to run test via sh fails on others,
  191.     # so this is the simplest alternative left.
  192.     # First find all the links, then test each one.
  193.     theselinks=
  194.     $LINKS && \
  195.       theselinks=`find $d/. -type l -print | sed -e 's@/./@/@g'`
  196.     for d1 in $theselinks --dummy--
  197.     do
  198.       # If the link points to a directory,
  199.       # add that dir to $newdirs
  200.       if [ -d $d1 ]
  201.       then
  202.         all_dirs="$all_dirs $d1"
  203.         if [ "`ls -ld $d1 | sed -n 's/.*-> //p'`" != "." ]
  204.         then
  205.           newdirs="$newdirs $d1"
  206.           search_dirs="$search_dirs $d1"
  207.         fi
  208.       fi
  209.     done
  210.   done
  211.  
  212.   dirs="$newdirs"
  213. done
  214.  
  215. # # # # # # # # # # # # # # # # # # # # #
  216. #
  217. dirs=
  218. if test $VERBOSE -gt 2
  219. then echo "All directories (including links to directories):"
  220.      echo $all_dirs
  221. fi
  222.  
  223. for file in $all_dirs; do
  224.   rm -rf $LIB/$file
  225.   if [ ! -d $LIB/$file ]
  226.   then mkdir $LIB/$file
  227.   fi
  228. done
  229. mkdir $LIB/root
  230.  
  231. # # # # # # # # # # # # # # # # # # # # #
  232. #
  233. # treetops gets an alternating list
  234. # of old directories to copy
  235. # and the new directories to copy to.
  236. treetops=". ${LIB}"
  237.  
  238. if $LINKS; then
  239.   if test $VERBOSE -gt 1
  240.   then echo 'Making symbolic directory links' ; fi
  241.   cwd=`${PWDCMD}`
  242.  
  243.   for sym_link in $search_dirs; do
  244.     cd ${INPUT}
  245.     dest=`ls -ld ${sym_link} | sed -n 's/.*-> //p'`
  246.  
  247.     # In case $dest is relative, get to ${sym_link}'s dir first.
  248.     #
  249.     cd ./`echo ${sym_link} | sed 's;/[^/]*$;;'`
  250.  
  251.     # Check that the target directory exists.
  252.     # Redirections changed to avoid bug in sh on Ultrix.
  253.     #
  254.     (cd $dest) > /dev/null 2>&1
  255.     if [ $? = 0 ]; then
  256.       cd $dest
  257.  
  258.       # full_dest_dir gets the dir that the link actually leads to.
  259.       #
  260.       full_dest_dir=`${PWDCMD}`
  261.  
  262.       # Canonicalize ${INPUT} now to minimize the time an
  263.       # automounter has to change the result of ${PWDCMD}.
  264.       #
  265.       cinput=`cd ${INPUT}; ${PWDCMD}`
  266.  
  267.       # If a link points to ., make a similar link to .
  268.       #
  269.       if [ ${full_dest_dir} = ${cinput} ]; then
  270.         if test $VERBOSE -gt 2
  271.         then echo ${sym_link} '->' . ': Making self link' ; fi
  272.         rm -fr ${LIB}/${sym_link} > /dev/null 2>&1
  273.         ln -s . ${LIB}/${sym_link} > /dev/null 2>&1
  274.  
  275.       # If link leads back into ${INPUT},
  276.       # make a similar link here.
  277.       #
  278.       elif expr ${full_dest_dir} : "${cinput}/.*" > /dev/null; then
  279.         # Y gets the actual target dir name, relative to ${INPUT}.
  280.         y=`echo ${full_dest_dir} | sed -n "s&${cinput}/&&p"`
  281.         # DOTS is the relative path from ${LIB}/${sym_link} back to ${LIB}.
  282.         dots=`echo "${sym_link}" |
  283.           sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
  284.         if test $VERBOSE -gt 2
  285.         then echo ${sym_link} '->' $dots$y ': Making local link' ; fi
  286.         rm -fr ${LIB}/${sym_link} > /dev/null 2>&1
  287.         ln -s $dots$y ${LIB}/${sym_link} > /dev/null 2>&1
  288.  
  289.       else
  290.         # If the link is to a dir $target outside ${INPUT},
  291.         # repoint the link at ${INPUT}/root$target
  292.         # and process $target into ${INPUT}/root$target
  293.         # treat this directory as if it actually contained the files.
  294.         #
  295.         if test $VERBOSE -gt 2
  296.         then echo ${sym_link} '->' root${full_dest_dir} ': Making rooted link'
  297.         fi
  298.         if [ -d $LIB/root${full_dest_dir} ]
  299.         then true
  300.         else
  301.           dirname=root${full_dest_dir}/
  302.           dirmade=.
  303.           cd $LIB
  304.           while [ x$dirname != x ]; do
  305.             component=`echo $dirname | sed -e 's|/.*$||'`
  306.             mkdir $component >/dev/null 2>&1
  307.             cd $component
  308.             dirmade=$dirmade/$component
  309.             dirname=`echo $dirname | sed -e 's|[^/]*/||'`
  310.           done
  311.         fi
  312.  
  313.         # Duplicate directory structure created in ${LIB}/${sym_link} in new
  314.         # root area.
  315.         #
  316.         for file2 in $all_dirs; do
  317.           case $file2 in
  318.             ${sym_link}/*)
  319.               dupdir=${LIB}/root${full_dest_dir}/`echo $file2 |
  320.                       sed -n "s|^${sym_link}/||p"`
  321.               if test $VERBOSE -gt 2
  322.               then echo "Duplicating ${sym_link}'s ${dupdir}" ; fi
  323.               if [ -d ${dupdir} ]
  324.               then true
  325.               else
  326.                 mkdir ${dupdir}
  327.               fi
  328.               ;;
  329.             *)
  330.               ;;
  331.           esac
  332.         done
  333.  
  334.         # Get the path from ${LIB} to ${sym_link}, accounting for symlinks.
  335.         #
  336.         parent=`echo "${sym_link}" | sed -e 's@/[^/]*$@@'`
  337.         libabs=`cd ${LIB}; ${PWDCMD}`
  338.         file2=`cd ${LIB}; cd $parent; ${PWDCMD} | sed -e "s@^${libabs}@@"`
  339.  
  340.         # DOTS is the relative path from ${LIB}/${sym_link} back to ${LIB}.
  341.         #
  342.         dots=`echo "$file2" | sed -e 's@/[^/]*@../@g'`
  343.         rm -fr ${LIB}/${sym_link} > /dev/null 2>&1
  344.         ln -s ${dots}root${full_dest_dir} ${LIB}/${sym_link} > /dev/null 2>&1
  345.         treetops="$treetops ${sym_link} ${LIB}/root${full_dest_dir}"
  346.       fi
  347.     fi
  348.   done
  349. fi
  350.  
  351. # # # # # # # # # # # # # # # # # # # # #
  352. #
  353. required=
  354. set x $treetops
  355. shift
  356. while [ $# != 0 ]; do
  357.   # $1 is an old directory to copy, and $2 is the new directory to copy to.
  358.   #
  359.   SRCDIR=`cd ${INPUT} ; cd $1 ; ${PWDCMD}`
  360.   export SRCDIR
  361.  
  362.   FIND_BASE=$1
  363.   export FIND_BASE
  364.   shift
  365.  
  366.   DESTDIR=`cd $1;${PWDCMD}`
  367.   export DESTDIR
  368.   shift
  369.  
  370.   # The same dir can appear more than once in treetops.
  371.   # There's no need to scan it more than once.
  372.   #
  373.   if [ -f ${DESTDIR}/DONE ]
  374.   then continue ; fi
  375.  
  376.   touch ${DESTDIR}/DONE
  377.   if test $VERBOSE -gt 1
  378.   then echo Fixing directory ${SRCDIR} into ${DESTDIR} ; fi
  379.  
  380.   # Check files which are symlinks as well as those which are files.
  381.   #
  382.   cd ${INPUT}
  383.   required="$required `if $LINKS; then
  384.     find ${FIND_BASE}/. -name '*.h' \( -type f -o -type l \) -print
  385.   else
  386.     find ${FIND_BASE}/. -name '*.h' -type f -print
  387.   fi | \
  388.     sed -e 's;/\./;/;g' -e 's;//*;/;g' | \
  389.     ${FIXINCL}`"
  390. done
  391.  
  392. ## Make sure that any include files referenced using double quotes
  393. ## exist in the fixed directory.  This comes last since otherwise
  394. ## we might end up deleting some of these files "because they don't
  395. ## need any change."
  396. set x `echo $required`
  397. shift
  398. while [ $# != 0 ]; do
  399.   newreq=
  400.   while [ $# != 0 ]; do
  401.     # $1 is the directory to copy from,
  402.     # $2 is the unfixed file,
  403.     # $3 is the fixed file name.
  404.     #
  405.     cd ${INPUT}
  406.     cd $1
  407.     if [ -f $2 ] ; then
  408.       if [ -r $2 ] && [ ! -r $3 ]; then
  409.         cp $2 $3 >/dev/null 2>&1 || echo "Can't copy $2" >&2
  410.         chmod +w $3 2>/dev/null
  411.         chmod a+r $3 2>/dev/null
  412.         if test $VERBOSE -gt 2
  413.         then echo Copied $2 ; fi
  414.         for include in `egrep '^[     ]*#[     ]*include[     ]*"[^/]' $3 |
  415.              sed -e 's/^[     ]*#[     ]*include[     ]*"\([^"]*\)".*$/\1/'`
  416.         do
  417.       dir=`echo $2 | sed -e s'|/[^/]*$||'`
  418.       dir2=`echo $3 | sed -e s'|/[^/]*$||'`
  419.       newreq="$newreq $1 $dir/$include $dir2/$include"
  420.         done
  421.       fi
  422.     fi
  423.     shift; shift; shift
  424.   done
  425.   set x $newreq
  426.   shift
  427. done
  428.  
  429. if test $VERBOSE -gt 2
  430. then echo 'Cleaning up DONE files.' ; fi
  431. cd $LIB
  432. # Look for files case-insensitively, for the benefit of
  433. # DOS/Windows filesystems.
  434. find . -name '[Dd][Oo][Nn][Ee]' -exec rm -f '{}' ';'
  435.  
  436. if test $VERBOSE -gt 1
  437. then echo 'Cleaning up unneeded directories:' ; fi
  438. cd $LIB
  439. all_dirs=`find . -type d \! -name '.' -print | sort -r`
  440. for file in $all_dirs; do
  441.   if rmdir $LIB/$file > /dev/null
  442.   then
  443.     test $VERBOSE -gt 3 && echo "  removed $file"
  444.   fi
  445. done 2> /dev/null
  446.  
  447. # On systems which don't support symlinks, `find' may barf
  448. # if called with "-type l" predicate.  So only use that if
  449. # we know we should look for symlinks.
  450. if $LINKS; then
  451.   test $VERBOSE -gt 2 && echo "Removing unused symlinks"
  452.  
  453.   all_dirs=`find . -type l -print`
  454.   for file in $all_dirs
  455.   do
  456.     if test ! -d $file
  457.     then
  458.       rm -f $file
  459.       test $VERBOSE -gt 3 && echo "  removed $file"
  460.       rmdir `dirname $file` > /dev/null && \
  461.            test $VERBOSE -gt 3 && \
  462.            echo "  removed `dirname $file`"
  463.     fi
  464.   done 2> /dev/null
  465. fi
  466.  
  467. if test $VERBOSE -gt 0
  468. then echo fixincludes is done ; fi
  469.  
  470. # # # # # # # # # # # # # # # # # # # # #
  471. #
  472. # End of for INPUT directories
  473. #
  474. done
  475. #
  476. # # # # # # # # # # # # # # # # # # # # #
  477.